Advanced Projects by Aacini - Spanish

English version

Me llamo Antonio Pérez Ayala, alias Aacini, y soy un fanático de las computadoras. Las matemáticas y la tecnología siempre me han fascinado y desde muy chico me atrajeron los aparatos electrónicos y gadgets. Comencé a utilizar vehículos eléctricos en mi ciudad natal, la Ciudad de México, desde hace muchos años. Antes de 1980 compré en Sam's dos pequeños scooters eléctricos. En 2002 compré dos vehículos eléctricos Segway HT i167 de la primer producción, que salió a la venta en Amazon. Recientemente he utilizado dos automóviles y una motocicleta eléctricos.

Este sitio trata sobre programas de computadora que yo he escrito. En esta página he subido algunas aplicaciones para Windows que he desarrollado en forma de proyectos personales. Usted puede descargar estas aplicaciones y utilizarlas gratuitamente, pero antes de presentar estos programas quiero compartir un poco de mi historia y de las razones que tuve para crear este sitio.

La información biográfica que sigue relata las innovaciones que he visto en aparatos electrónicos y los logros que he conseguido en la programación de computadoras. Esta es la única página que contiene datos personales, así que si esta historia le parece aburrida, tan sólo ignórela y pase al final del documento en donde se encuentran los proyectos de software.

Contenido

  1. En el principio - cosas que vi en mis primeros años
  2. Mis calculadoras electrónicas y otros dispositivos de cálculo
  3. Mi primer trabajo en el CECAFI: lenguaje ensamblador IBM-1130 y muchas cosas nuevas
  4. Mi segundo trabajo en la SDDNP: trucos con Algol y WFL de la Burrough's B6700
  5. El negocio familiar y nuestras computadoras: Cromemco Z-2H y una IBM-PC "compatible"
  6. Mis proyectos para MS-DOS - mejores archivos Batch, gráficas y nuevos lenguajes de programación
  7. Mis proyectos para Windows - HTML, JavaScript y mas gráficas
  8. Los proyectos de software

En el principio

Nací en la Ciudad de México en 1955. Cuando yo era niño aún no se habían inventado ninguno de los aparatos o dispositivos electrónicos de uso común actualmente. La única tecnología en casa era una consola grande y pesada con un tocadiscos de 78 RPM y unos cuantos discos de vinilo de Enrico Caruso y Édith Piaf que pertenecían a mi padre. También teníamos una pequeña televisión en blanco y negro. En ese entonces la única forma de conseguir algún dispositivo electrónico novedoso era ir a otro país, como los Estados Unidos, comprar el aparato y traerlo a casa. Desafortunadamente, mi familia no disponía de los medios suficientes para hacer eso. De vez en cuando una tía que vivía en los EUA nos traía algún obsequio comprado allá, y así fué como tuve contacto con algunas novedades electrónicas. Recuerdo un equipo de control remoto formado por una caja pequeña de plástico que tenía un silbato que emitía un sonido al aplastarla (éste era el control remoto) y el receptor que era otra caja con un enchufe que se conectaba a un tomacorriente. Un aparato eléctrico, como una lámpara, se conectaba al receptor y esto permitía encenderla o apagarla al hacer silbar el control remoto. Muchos años después tuvimos una televisión a color que incluía un control remoto con tres botones: encender/apagar y cambiar canales hacia arriba o abajo. El control tenía una pequeña bocina al frente que yo supuse emitía las señales por sonidos de alta frecuencia. Cuando tuve edad suficiente comencé a leer revistas especializadas, como "Mecánica Popular", que de vez en cuando incluía un artículo sobre algún dispositivo electrónico novedoso. Recuerdo que ahí leí sobre el Heathkit H8, una microcomputadora que se vendía como un equipo de piezas para armar, pero sin la posibilidad de pedirlo desde México.

Cuando cumplí 14 años me regalaron un radio AM-FM y tocadiscos portátil que funcionaba con baterías. Yo tenía una pequeña colección de música pop de mediados y finales de los 60's formada por varios discos de vinilo de 45 y 33 1/3 RPM. Este equipo me permitió llevar mi música para escucharla donde yo quisiera, aunque era un problema cargar con los discos y el tocadiscos. Un día mi mejor amigo de la secundaria y yo nos fuimos de pinta a Ciudad Universitaria llevando el tocadiscos, varios discos y un carro Avalancha, con los cuales nos subimos al camión de pasajeros. Al llegar allá acomodamos las cosas en el Avalancha y así recorrimos todas las facultades y explanadas de CU a las que pudimos llegar rodando. ¡Fue una fantástica aventura! Poco después conseguí una grabadora de casettes usada en una tienda de artículos de segunda mano en el centro de la ciudad. Recuerdo cómo esta grabadora me proporcionó tres importantes características: grabar muchas canciones en un sólo casette de 60 o 90 minutos de duración mucho mas pequeño que un disco, tocar sólo una selección de las mejores canciones de mi colección, y poder escuchar la música incluso al ir caminando. Aunque también había casettes de 120 minutos, yo no los utilizaba porque con frecuencia la frágil cinta se atascaba en la grabadora.

Cuando los reproductores portátiles de discos compactos (CD) salieron a la venta, algunos años después, fueron mas convenientes porque eran mas pequeños que la grabadora y un CD era mas durable que un casette, pero entonces hubo que comprar otra vez todos los discos CD con la música favorita y guardar los discos de vinilo en el desván. El desarrollo de métodos estándar para la compresión de audio (como el formato de archivos MP3, que rápidamente se hizo popular) y la salida al mercado de reproductores portátiles de CD compatibles con MP3 trajeron consigo ventajas similares a las de la grabadora de casettes, y muchas más. Yo podía grabar en un sólo CD casi once horas de música en formato MP3 a la codificación estándar de 128 kbps y después, cuando los discos DVD grabables salieron al mercado (junto con los reproductores compatibles) se podía grabar en ellos ¡casi 7 veces más! Yo grabé en un sólo DVD un montón de música rock y pop de los 60's y 70's, incluídas las 226 canciones de los 15 primeros discos de los Beatles (incluídos "Past Masters" volúmenes uno y dos), las mejores canciones (casi todas) de Queen, Bee Gees, Grand Funk, Carpenters (¡yo amaba a Karen! :-), Chicago, Abba, Rolling Stones, Creedence, etc. También la mayoría de las canciones de artistas en español como Mecano, José José, Mocedades, Alaska, Roberto Carlos, etc, además de muchas canciones individuales de artistas menos conocidos. Esta colección sumaba 1,285 canciones que requerían 4.37 GB, por lo que cabía perfectamente en un sólo DVD grabable estándar con 4.70 GB de capacidad. Yo grabé la mayoría de estas canciones a partir de los CD's originales que compré y algunas canciones que no pude conseguir las grabé de mis viejos discos de vinilo procesados con las primeras versiones de hardware y software diseñadas para pasar música analógica a archivos MP3. Una pequeña parte de mi colección la grabé de discos CD que les pedí prestados a mis amigos.

Algún tiempo después descubrí los reproductores portátiles de MP3 que utilizaban un disco duro. En ese entonces yo ya tenía una computadora con conexión a internet (a través de un lento módem telefónico), por lo que esta vez fue mucho mas facil buscar y localizar los nuevos productos. Encontré sólo dos dispositivos de este tipo: un reproductor sumamente caro del que no recuerdo nada más, y el Archos Jukebox 6000 con un disco de 6 GB de capacidad el cual vendían en Estados Unidos pero pude ordenarlo en línea desde México pagándolo con una tarjeta de crédito internacional, que también era algo novedoso en ese entonces. Este reproductor MP3 con disco duro fue entregado en mi casa "tan sólo" dos meses y medio después de ordenarlo. Mi "habilidad" para comprar mi primer Jukebox desde México refleja el desarrollo que habían tenido las comunicaciones y el comercio internacional en ese entonces.

Esta breve historia sobre la manera en que los dispositivos reproductores de música fueron evolucionando durante los primeros 45 años de mi vida da una idea del desarrollo de la tecnología en general durante el mismo período. Yo he sido testigo del nacimiento y evolución de prácticamente toda la tecnología de computadoras y dispositivos electrónicos en uso actualmente, como son las calculadoras electrónicas, el lenguaje de programación Pascal y las tecnologías de Programación Estructurada, el sistema operativo UNIX y el lenguaje de programación "C", calculadoras Hewlett-Packard, teléfonos de ladrillo celulares, la computadora IBM-PC y todos sus derivados, la internet, el iPod, el lenguaje Java y una muy larga lista de otros. Yo podría llenar varios volúmenes sólo con mis experiencias en esta área. Sin embargo, me limitaré a escribir aquí solamente sobre mis calculadoras y los programas para computadora que he escrito.
Top

Mis calculadoras electrónicas

En mi último año de preparatoria (alrededor de 1974) yo usaba un pequeño ábaco, que compré en una tienda de juguetes, para hacer operaciones aritméticas mas rápido que mis compañeros. ¡Aún conservo ese ábaco! En esa época el uso de la regla de cálculo se enseñaba hasta la universidad. El año que yo entré a la universidad (1975) fue la última vez que la regla de cálculo se enseñó en el salón de clases. Recuerdo cómo el maestro manipulaba una enorme regla de casi dos metros de largo colgada en la parte superior del pizarrón.

Cuando yo tenía 18 años mi papá compró una calculadora Brother PRO-CAL 408 (1971), pero nunca la usó para hacer operaciones; mas bien, la adquirió como una curiosidad. Era uno de los primeros modelos de calculadora electrónica de tamaño relativamente pequeño y con baterías. Aún la conservo en buenas condiciones. Con el correr de los años compré varias calculadoras y dispositivos electrónicos; en particular, modelos novedosos con alguna característica diferente. Por ejemplo, compré una Casio fx-190, "Calculadora científica y regla electrónica" que permitía tomar medidas mediante una escala de segmentos LCD. También una "Regla de cálculo electrónica" Nesa Novus, la primer (¿quizás la única?) calculadora hecha en México que funcionaba mediante notación RPN y un stack de 3 niveles. Esta calculadora es muy rara actualmente; parece ser una versión en español de la NSC Novus 4510 "Mathematician" de 1976.

En 1975, cuando entré a la universidad, yo usaba una Sears Electronic Slide Rule, calculadora electrónica de atractivo color negro y teclas blancas que se guardaba en una funda rígida. Recuerdo que utilizé varias tarjetas de cartulina blanca, que cabían en la funda de la calculadora, para copiar cuidadosamente las fórmulas matemáticas que utilizaba en mis clases en la facultad. Después conseguí una calculadora programable Texas Instruments TI-59 (1977) con su impresora PC-100A, una computadora casera Commodore 64 de 1982 (que compré en Aurrerá), una PSION Organiser II modelo XP de 1986, "calculadora" de mano (realmente era una de las primeras PDA) que utilizaba el lenguaje de programación OPL similar a Basic, pero con un compilador. También una Atari Portfolio (1989), primer Palmtop PC que traía MS-DOS 2.11 integrado en ROM y varios dispositivos periféricos.

En mi primer año en la universidad descubrí las calculadoras Hewlett-Packard. Uno de mis profesores, que después sería mi amigo, tenía una de las primeras HP-35's, y otra persona ahí compró después una HP-55. Un día, uno de mis compañeros de clase me enseñó su flamante HP-21 que acababa de comprar en EUA poco después de que este modelo salió a la venta. Mi compañero había viajado a Estados Unidos durante el fin de semana solamente para comprar la calculadora. Poco después conseguí mi primer calculadora Hewlett-Packard: la nueva HP-25. Recuerdo que la posibilidad de programar esta calculadora me permitió terminar mi siguiente examen de Métodos Numéricos mucho mas rápido que mis compañeros; el profesor estaba muy impresionado por las capacidades de la pequeña calculadora.

Mi hermano Enrique, dos años mayor que yo, compró una HP-29C cuando salió a la venta. Algunos meses más tarde una de mis tías nos dió a mi hermano y a mí un regalo fantástico: una flamante calculadora HP-67. (Cuando escribo esto me doy cuenta que las posibilidades económicas de mi tía no eran muy grandes, así que debió hacer un esfuerzo considerable para comprar esa calculadora... ¡Gracias, tía Chabelita!). Alrededor de 1980, cuando fue necesario comprar una computadora para llevar las cuentas en el negocio de mi papá, yo evalué la "Calculadora de escritorio " HP-9830A a la que se le podían conectar varios dispositivos, pero al final no la compramos. Con el paso del tiempo compré varios modelos de calculadoras científicas HP y aún conservo casi todas. Cuando la HP Prime salió a la venta quise comprarla, pero pensé que realmente no la iba a usar. Sin embargo, en marzo de 2014 compré una Swiss Micros DM-15 que es un clon de la HP-15C en un tamaño pequeño que está fabulosa.

En los últimos años me convertí en coleccionista de calculadoras antiguas y adquirí varios dispositivos de cálculo de diversos tipos: desde un soroban (ábaco japonés) y reglas de cálculo tradicionales, pasando por calculadoras mecánicas fabricadas con diversos materiales (como los dos modelos de la calculadora mecánica Curta), hasta algunos artículos muy especiales, como una HP Xpander nueva en caja que le compré a un antiguo empleado de HP. Estoy preparando imágenes de mi colección para subirlas a este sitio.
Top

Mi primer trabajo

Afortunadamente nací en la Ciudad de México en donde se localiza la Universidad Nacional Autónoma de México (UNAM), lugar que cuenta con un gran número de facilidades e instalaciones para estudiar y en donde se hace investigación y desarrollo en ciencias de muchas áreas.

Cuando yo estaba por terminar la prepa, mi hermano Enrique estudiaba Ingeniería Industrial en la Facultad de Ingeniería de la UNAM. En 1975, durante las vacaciones entre la prepa y la universidad, aprendí el lenguaje de programación FORTRAN leyendo en casa el libro FORTRAN de Daniel D. McCracken (con portada negra y letras rojas) propiedad de Enrique y escribí un primer programa de prueba. Mi hermano me llevó al Centro de Cálculo de la Facultad de Ingeniería (CECAFI) en donde me mostró cómo le hacían los alumnos de la facultad para usar la computadora IBM-1130. Me llevó a una ventanilla en donde compré un paquete con 100 tarjetas para computadora por 8 pesos, más una tarjeta "Job" de color naranja por 3 pesos más. Después me llevó a una sala y me enseñó a usar una perforadora de tarjetas IBM 029 como la que aparece a la derecha (que sólo tenía letras mayúsculas) y me dió otras indicaciones. Cuando terminé de perforar mi programa le puse la tarjeta Job al frente y entregué el paquete de tarjetas al encargado del mostrador, quien me dió a cambio una ficha numerada que correspondía a uno de los casilleros que estaban atrás. Los paquetes de tarjetas se acumulaban en una caja y con regularidad el operador de la computadora iba por ellos para procesarlos y después envolvía las tarjetas con el listado obtenido y las ponía en los casilleros. Como media hora después vi que pusieron un paquete de tarjetas en mi casillero, así que entregué mi ficha y me regresaron mi programa con el listado obtenido y la tarjeta Job cortada a la mitad, es decir, cada corrida de un programa costaba 3 pesos. Mi primer programa calculaba una tabla de raíces cúbicas de los números del 1 al 1200 y los imprimía en 5 columnas por hoja con 7 dígitos decimales. El programa corrió sin errores al primer intento el 7 de mayo de 1975 (aún conservo el listado con el resultado).

Después de que entré a la Facultad de Ingeniería a la carrera de Ingeniero en Computación (yo pertenezco a la primer generación de esta nueva carrera) comencé a ir con frecuencia al CECAFI para darles consejos a otros estudiantes sobre cómo escribir sus programas y explicarles sus errores. Poco tiempo después, el CECAFI me contrató como Técnico Académico Auxiliar. Mucho tiempo después me enteré que estos contratos sólo se daban a estudiantes del último semestre que no debieran materias (parece ser que en mi caso "omitieron" dichos requisitos para poder contratarme tan joven). Al ingresar ocupé gran parte de mi tiempo investigando nuevas tecnologías. Aprendí los lenguajes de programación PL/I, Basic y Pascal en computadoras de diferentes tamaños, aunque nunca pude aprender COBOL. Todas estas actividades iban en detrimento de mis "tareas asignadas" en el CECAFI así como de mis estudios en otras áreas, pero mi jefe en el CECAFI rápidamente aceptó esta realidad y reasignó parte de mis deberes de manera que concordaran con mis intereses. Así fue como impartí numerosos cursos sobre la mayoría de los lenguajes de programación utilizados en ese entonces, con la excepción de COBOL y RPG. Toda la vida he tenido interés en enseñar temas de computación de la manera mas simple posible a gente sin experiencia y en desarrollar sistemas o métodos que faciliten esta labor. Cuando salí del CECAFI continué dando clases de computación en la División de Educación Continua de la Facultad de Ingeniería ubicada en el Palacio de Minería, en donde me dieron la oportunidad de impartir clases basadas en mis proyectos personales.

Aprendí por mi cuenta el lenguaje ensamblador de la IBM-1130 y las funciones de servicio del Sistema Operativo en la extensa documentación técnica que tenía el CECAFI sobre la IBM-1130 y utilicé esa información para escribir programas poco comunes que permitían utilizar las funciones que no estaban al alcance de los lenguajes de programación convencionales. Por ejemplo, cuando un error de ejecución ocurría en un programa escrito en FORTRAN, la computadora detenía su operación mostrando un código de error en las luces del panel. El operador tenía que buscar la tarjeta Job del programa correspondiente para escribir en ella, a mano, el código de error (por ejemplo: "F003") y después oprimir un botón para que la computadora continuara trabajando. Esto retrasaba el proceso de los programas y con frecuencia los alumnos no entendían qué significaban aquellos garabatos escritos en la tarjeta naranja. Yo escribí una subrutina en lenguaje ensamblador que permitía que un programa FORTRAN imprimiera el error en el listado junto con una descripción detallada del mismo.

Escribí un programa que revisaba el contenido de todo un disco e imprimía aquellos sectores que contuvieran texto legible, así como un segundo programa que permitía modificar el contenido de cualquier sector. Estos dos programas eran muy similares en su estructura y sólo diferían en detalles, así que escribí ambos programas en un mismo paquete de tarjetas perforadas colocando dos instrucciones en tarjetas de diferente color, para identificarlas facilmente. Las instrucciones del lenguaje ensamblador de la IBM-1130 se escribían en unas cuantas columnas a partir de la número 21 e ignoraban todo lo que viniera después, así que yo escribí una segunda instrucción a partir de la columna 60 en sentido opuesto. De esta manera, bastaba con colocar todas las tarjetas de color de frente o volteadas para seleccionar el programa deseado (un amigo le llamó a ésto "instrucciones palíndrómicas"). Utilicé estos programas para localizar los mensajes de error del compilador FORTRAN y cambiarlos por mensajes equivalentes en español (que no fueran mas largos que los originales).


@@@@@
 @  @@
 @  @@   @@    @@ @@   @@ @@    @@   @@ @
 @@@@      @    @@ @    @@ @   @  @   @@ @
 @  @@   @@@    @  @    @  @   @@@    @
 @  @@  @  @    @  @    @  @   @      @
@@@@@    @@ @  @ @ @@  @ @ @@   @@@  @ @

@@@@  @@@@  @@@@  @@@@  @@@@  @@@@  @@@@
@  @  @  @  @  @  @  @  @  @  @  @  @  @
@  @  @  @  @  @  @  @  @  @  @  @  @  @
@  @@@@  @@@@  @@@@  @@@@  @@@@  @@@@  @@@

Definí una forma básica de arte ASCII por medio de tarjetas perforadas en las que cada perforación equivalía a un "pixel". Cada columna de una tarjeta tenía 12 zonas, así que se podían perforar hasta 12 agujeros por columna utilizando la tecla especial "multi-punch" de la perforadora. Esto permitía crear diseños complejos juntando varias tarjetas. Un programa en ensamblador leía las tarjetas (que no podían leerse correctamente con ningún otro lenguaje de programación) e imprimía el diseño en hojas de papel continuo. Una tarjeta y media se usaba para imprimir las (80+40=) 120 posibles columnas de la impresora y las 12 zonas de la tarjeta producían 12 líneas impresas. Utilicé este método para imprimir los letreros informativos que se pegaban en las paredes del CECAFI, que desde ese día estuvieron formados por grandes letras góticas o itálicas decoradas con flores o motivos diversos (compré varios folletos de patrones de tejido de punto de cruz para crear los diseños).

Como una experiencia educativa, escribí un programa muy simple en ensamblador y lo traduje a código binario utilizando la tabla de equivalencias del manual. Entonces, cargué manualmente el programa en la memoria de la computadora mediante el mismo método utilizado por los programadores de antaño hace muchos años: usando los switches que la IBM-1130 tenía en la consola como una reminiscencia de máquinas antiguas. Para empezar, giré el dial de "Modo de operación" colocado a la derecha del panel en la posición LOAD (cargar, en lugar de la usual RUN). Después, cuidadosamente copié un valor binario de 16 bits en los 16 switches y oprimí un botón para cargar dicho valor en la memoria, y repetí este proceso con todos los valores que formaban el programa. Finalmente, giré el dial a la posición SI (Single Instruction = una sóla instrucción) para que el programa se ejecutara instrucción por instrucción al oprimir un botón. Los resultados se podían revisar en las luces del panel que reflejaban los valores de los registros del CPU. ¡Fantástico! :)

Desarrollé un método para instalar dos compiladores diferentes en un mismo disco: el COBOL de IBM y otro producto, que no era de IBM, llamado FORTRAN-EMU desarrollado por la Eastern Michigan University. Cuando llegué al CECAFI los programas FORTRAN-IV (EMU) y COBOL no podían procesarse al mismo tiempo porque requerían de un cambio del disco, pero dicho cambio era un proceso tardado que no convenía repetir con frecuencia. El operador de la computadora esperaba hasta que un número suficiente de programas COBOL se acumulaban en su caja para entonces hacer el cambio de disco y procesarlos, lo que significaba que los alumnos que utilizaban COBOL a veces tenían que esperar demasiado tiempo por sus resultados. Sin embargo, cuando había un examen de alguna materia que utilizaba COBOL el CECAFI le daba preferencia, y entonces eran los alumnos que usaban FORTRAN los que tenían que esperar. El lector interesado puede leer una explicación completa de este problema y la manera en que lo resolví en esta página. Hasta donde yo sé, la IBM-1130 del CECAFI fue la única computadora que tuvo este problema resuelto.

Un día, una microcomputadora Radio Shack TRS-80 llegó al CECAFI junto con varios paquetes y lenguajes de programación. Aprendí el lenguaje ensamblador del procesador Z-80 y las funciones de servicio del sistema operativo TRSDOS (¿"tris-dos"?). El ensamblador de la TRS-80 venía en un casette que se leía en una grabadora de casettes estándar. La computadora también tenía dos unidades de disco flexible, pero el esquema de protección incorporado a los casettes impedía copiar un programa de casette a disco. Escribí un programa en ensamblador para brincarse el esquema de protección y hacer esta copia, principalmente con el objetivo de copiar (y proteger contra daño) al ensamblador, pero que también permitiría copiar cualquier programa que viniera en casette, como juegos. El desarrollo de este programa requería varias pruebas y en cada una de ellas el casette del ensamblador se tenía que leer dos veces: una para ensamblar mi programa y otra para leer (y copiar) el ensamblador. Recuerdo claramente la preocupación que sentía de que la cinta se atascara en la grabadora cada vez que oprimía el botón Play y el enorme alivio (y satisfacción) que sentí cuando finalmente el ensamblador se pudo copiar a un diskette.

También por aquél tiempo el CECAFI recibió una copia del lenguaje de programación Regular Expression Compiler (REC) desarrollado en el Centro de Cómputo Electrónico de la UNAM, en México, por Harold V. McIntosh. Este lenguaje, basado en Lisp, fue diseñado alrededor de 1966 y no utiliza la instrucción GOTO, por lo que era precursor de la Programación Estructurada. Instalé este lenguaje en la IBM-1130 y lo utilicé extensivamente. El lenguaje REC ha influenciado muchos de los proyectos que desarrollé posteriormente. Un día mi jefe me encargó un programa algo difícil y me dió dos semanas para entregarlo. Los siguientes días él vió que yo estaba muy ocupado, pero yo no le decía lo que estaba haciendo. Faltando 3 días para terminar el plazo me preguntó qué estaba haciendo. Probando REC fue mi respuesta. ¡¿Y el programa que te encargué?! Ya lo pensé. A mi jefe casi le dio un infarto, pero esto era verdad: la parte mas difícil del programa era diseñar un determinado método para hacer algo. Yo había pasado dos días completos diseñando dicho método y ya estaba listo, así que lo único que faltaba era simplemente escribir el programa y probarlo. El último día del plazo hice esto y antes del mediodía el programa estaba listo.

Alrededor de 1977 el CECAFI recibió una copia del lenguaje de programación APL\1130 el cual era un intérprete interactivo para un sólo usuario diseñado con una sintaxis inusual que requería un juego de caracteres no estándar, por lo que el lenguaje sólo se podía utilizar en dispositivos que pudieran mostrar el juego especial de caracteres APL. La consola de la computadora IBM-1130 utilizaba el mismo mecanismo de las máquinas de escribir IBM Selectric por lo que era posible cambiar la esfera de impresión y el paquete APL\1130 incluía la esfera APL correspondiente. Recuerdo cómo fueron pegadas a las teclas las calcomanías del teclado APL (que requería dos teclas de "shift": arriba y derecha) y cómo cambiaba yo el elemento de impresión de la consola cada vez que utilizaba APL (al mismo tiempo que suspendía el servicio de computación a todos los alumnos de la facultad).

El lenguaje APL tiene una estructura muy diferente a los demás lenguajes de programación que permite efectuar complicadas operaciones sobre arreglos multi-dimensionales utilizando unos pocos operadores, lo que implica código muy simple visualmente, pero muy denso conceptualmente. Recuerdo claramente que el uso cada vez mas profundo del lenguaje APL expande la mente de formas inusuales. Pienso que yo fui una de las primeras personas en utilizar APL fuera de los EUA y estoy seguro que fui el primero en enseñar APL en la UNAM, y por lo tanto en México.

En 1986 fui contratado como programador APL en una empresa privada y desarrollé sistemas financieros en una terminal de una computadora IBM System/360 por más de un año. También impartí clases privadas sobre el lenguaje APL a un grupo de personas que trabajaban en IBM de México poco antes de que la nueva computadora IBM 5120, que incluía los lenguajes Basic y APL, saliera a la venta en México.

Top

Mi segundo trabajo

En 1982 salí del CECAFI invitado por mi jefe inmediato (que también salió para ocupar un puesto de nueva creación en otra dependencia de la UNAM) y me uní a un equipo de 4 personas encargadas de diseñar y desarrollar nuevos sistemas administrativos escritos en el lenguaje de programación Algol 60 que correrían en la computadora mainframe Burroughs B6700 instalada en el Centro de Servicios de Cómputo de la UNAM.

La Coordinación de la Administración Escolar (CAE) era la entidad de la UNAM responsable de distribuír los alumnos de primer ingreso a las diferentes escuelas del sistema, y nuestro equipo (la Subdirección de Diseño y Desarrollo de Nuevos Proyectos: SDDNP) tenía la tarea de actualizar los viejos sistemas de distribución de alumnos escritos en COBOL y desarrollar varios sistemas nuevos, mas pequeños.

Después de ambientarme y conocer un poco más sobre la computadora Burroughs, continué con mis "proyectos" personales. Utilicé una característica poco conocida del lenguaje de control de procesos WFL de una forma inusual que le permitió a nuestro equipo brincarse la cola de entrada de procesos (que en ocasiones era muy larga) y compilar y correr nuestros programas de forma inmediata (por favor, ¡no me pidan esta aplicación! ;-). Un día me enteré que el compilador Algol podía imprimir una lista completa de todos los posibles errores de compilación. Cuando estaba revisando este listado me di cuenta que había varios errores relacionados con el tipo de datos Complex el cual no estaba documentado en los manuales originales de la Burroughs. Después de varias pruebas descubrí que el compilador Algol podía, de hecho, manejar números complejos, así que escribí una pequeña guía sobre el "Uso de números complejos en Algol Burroughs" la cual tuvo una pequeña difusión en la CAE.

En menos de un año nuestro equipo en la SDDNP desarrolló varios sistemas de tamaño medio y dos sistemas completamente nuevos de asignación de alumnos de primer ingreso a los niveles de bachillerato (preparatorias y Colegios de Ciencias y Humanidades) y licenciatura (facultades y escuelas de la UNAM). Estos sistemas se utilizaron por primera vez en el año escolar 1983-1984, cuando fueron procesados alrededor de 40,000 registros de bachillerato y mas de 32,000 de licenciatura, y resolvieron la mayoría de los problemas que presentaban los sistemas anteriores. Por ejemplo, cuando se publicaban los resultados de la asignación de bachillerato se acostumbraba contratar personal adicional en muchas preparatorias y CCH's para atender las múltiples quejas de los alumnos inconformes con su asignación que pedían cambiar de plantel, pero ese año dicho personal permaneció prácticamente ocioso debido a la drástica reducción en el número de quejas (ese año fue el último que se contrató a dicho personal). El 28 de febrero de 1984 recibí una carta personal de felicitación firmada por Raúl Béjar Navarro, Secretario General de la UNAM, en la que me felicitaba por "los resultados altamente satisfactorios" obtenidos de los nuevos sistemas de asignación de alumnos a primer ingreso. Aún guardo dicha carta como un tesoro.

Poco tiempo después tuve que renunciar a la SDDNP para ayudar a atender el negocio de la familia fundado por mi padre. Casi un año después, el 19 y 20 de septiembre de 1985, ocurrieron los grandes terremotos en la Ciudad de México. El 22 de septiembre los miembros originales de la SDDNP fuimos convocados por un directivo de CAE para invitarnos a participar en el desarrollo de un sistema de emergencia destinado a coordinar la ayuda humanitaria que recibía la Cruz Roja Mexicana como donativos, con las necesidades específicas de la gente afectada por el terremoto, incluído el identificar aquellos bienes o servicios faltantes que era necesario solicitar o adquirir. Cuando vi otra vez a mi antiguo jefe de la SDDNP me dijo que en el terremoto ¡había perdido su calculadora HP 35! Casi un año había pasado desde la última vez que mis amigos y yo habíamos trabajado juntos, pero después de un corto período de "calentamiento", nuestro equipo se coordinó como en los viejos tiempos y diseñamos y programamos el sistema completo en Algol en menos de una semana (ignorando por completo a otras personas de CAE que supuestamente también estaban participando). El jefe del proyecto en CAE comentó que nunca había visto a un equipo trabajar de la manera tan coordinada y eficiente como lo hacíamos nosotros, y eso que él tenía muchos años de experiencia en ese puesto. El sistema terminado (apodado "Celestina" por el jefe del proyecto) fue donado a la Cruz Roja (en nombre de CAE, por supuesto) y funcionó a la perfección.
Top

El negocio familiar

Muchos años antes de que yo naciera, mi padre fundó un pequeño negocio de metal-mecánica que lentamente fue creciendo al paso de los años. La empresa era una típica organización familiar, por lo que los cuatro hijos varones de mi padre crecieron sabiendo utilizar las herramientas del taller. En 1968, cuando mi hermano Enrique tenía 14 años y yo 12, entre él y yo construímos un "carrito" para jugar de la misma manera que muchos niños lo habían hecho antes. La diferencia era que nosotros teníamos el taller de mi papá a nuestra disposición, así que nuestro carrito era diferente: tenía ruedas de hule con baleros, un volante de dirección y una palanca de freno para las ruedas traseras. Cuando mi papá lo vió le gustó mucho, así que le hizo varias mejoras y comenzó a fabricarlo en su taller para venderlo. Lo llamó "Carro deslizador Avalancha™" y registró la marca. Durante muchos años trabajé en el taller participando en la fabricación de Avalanchas hasta que entré a la universidad, cuando continué ayudando pero en labores administrativas del negocio.

A comienzos de 1981 le propuse a mi padre comprar una computadora para llevar la administración de su negocio. Evalué la "calculadora de escritorio" HP-9830A pero finalmente me decidí por un sistema de microcomputadora Cromemco Z-2H con dos unidades de diskette de 5 1/4", un disco duro de 11 MB, dos terminales inteligentes, una impresora de alta calidad (aunque era algo lenta) y una gran cantidad de software y manuales adicionales; todo por el equivalente de más de $20,000 dólares. La Cromemco tenía un CPU Zilog Z-80 que corría Cromix (el primer sistema operativo para microcomputadoras similar a Unix) con extraordinaria eficiencia. Utilicé el lenguaje Cromemco Structured Basic para desarrollar las aplicaciones administrativas del negocio, pero también dominé el ensamblador Z-80, el lenguaje de programación C y los servicios del sistema operativo UNIX en esa máquina.

Cada terminal Cromemco 3102 tenía un procesador que permitía mostrar un formato de entrada de datos y validarlos independientemente del procesador central. Escribí una aplicación en ensamblador que hacía lo siguiente: armaba un formato de entrada de datos en la terminal, lo activaba y ponía la terminal fuera-de-línea. Entonces esperaba hasta que el usuario oprimiera la tecla Send para entonces validar los datos recibidos y, si estaban incompletos, automáticamente pedir a la terminal un re-envío de datos. Esta aplicación permitía que un gran número de procesos de captura de datos corrieran al mismo tiempo sin pérdida de datos. Vendí unas cuantas copias de esta aplicación. Uno de mis clientes tenía un sistema Cromemco grande con ocho terminales que trabajaban todo el día capturando datos. ¡Qué rendimiento obtenido de un sólo CPU Z-80! Aún conservo como nuevos todos los manuales de la Cromemco. Por cierto, el compilador C incluía una copia de la primer edición del libro The C Programming Language, que es otro de mis tesoros.

Como dos años después de que compramos la Cromemco, la IBM-PC salió a la venta en México seguida de PC-clones mas baratos, por lo que finalmente pude comprar una computadora por mí mismo. Al poco tiempo de que compré mi PC tomamos la decisión de reemplazar la Cromemco por una computadora Columbia PC-compatible de escritorio (vendida en México bajo la marca "Printaform") con una unidad IOmega Bernoulli Box doble con cartuchos removibles de 10 MB cada uno y una impresora de matriz de puntos muy rápida. Elegí la aplicación de base de datos dBASE-IV de Ashton-Tate para desarrollar las aplicaciones administrativas, complementada con el compilador Clipper de Nantucket, y el paquete FrameWork III de Ashton-Tate como "suite integrada" (es decir, para "escribir cartas" ;-). Aún conservo todas estas aplicaciones en muy buena condición. También tengo una caja original del Columbia Super Pack como nueva.

Al mismo tiempo (1984) decidí renunciar a mi trabajo en la SDDNP para poder dedicar tiempo completo al desarrollo de los nuevos sistemas para la IBM-PC y procesar todos los datos importantes por mí mismo. Esta decisión fue influenciada por un proyecto que solicitó mi padre a una agencia de servicios de administración de negocios que supuestamente convertiría el negocio familiar en una empresa administrada profesionalmente. Sin embargo, esta transformación requería que mi padre delegara las numerosas responsabilidades que tenía en su empresa, pues él lo hacía todo tal y como lo había venido haciendo desde hacía más de 40 años, pero él nunca aceptó eso realmente. La empresa siguió dependiendo totalmente de él para su operación. Después de unos cuantos años de grandes producciones anuales de Avalanchas, la competencia de otros carritos parecidos y la disminución en ventas de este tipo de juguetes (incluídas las bicicletas, patines y demás) ocasionaron que la empresa de mi padre declinara año con año. A principios de 2004 mi papá cerró su negocio familiar. La marca registrada "Avalancha" se la "apropió" otra compañía como si un indio apache te hubiera robado en despoblado...
Top

Mis proyectos para MS-DOS

Como dije antes, en 1982 la IBM-PC comenzó a venderse en México, pero era muy cara. Poco tiempo después otras compañías comenzaron a fabricar clones "PC-compatibles" a precios mucho menores, por lo que al fin pude comprar una computadora para mi uso personal: una Columbia Data Products VP, vendida en México como "Columbia Printaform transportable", que tenía MS-DOS 2.11, un monitor monocromático verde de 9", dos unidades de diskette de 5 1/4" y un teclado que se acomodaba dentro de una tapa que cerraba la computadora y formaba una caja grande y pesada. Aún conservo esa computadora en funcionamiento. También compré los lenguajes Turbo-Pascal 3.0, Turbo-Assembler 1.0 y Turbo-C 1.5 de la compañía Borland. Aún los conservo todos. Me acostumbré a utilizar Turbo-Pascal como editor de texto debido a su tamaño pequeño y facilidad de uso, y continué utilizándolo de esta manera por muchos años más.

Estudié la forma de escribir programas para el CPU Intel 8086 en el manual de Turbo-Assembler, así como la descripción de las instrucciones del CPU en el libro The 8086 Book y las funciones de servicio del BIOS y del DOS en la excelente documentación proporcionada con la Columbia. También leí sobre nuevas técnicas en revistas especializadas, como el Dr. Dobbs Journal. Con esta información comencé a escribir programas auxiliares en ensamblador que ejecutaban tareas que los comandos MS-DOS estándar no podían hacer, como eran el guardar la salida de un comando en una variable, efectuar operaciones aritméticas, mover el cursor, mostrar texto en color, etcétera. Estos comandos aumentaban las capacidades de los archivos Batch .BAT de MS-DOS, así que los agrupé en un paquete llamado PI-BATCH (nombre tomado de Batch++ o "Post-Incremented Batch"). También definí una versión avanzada del lenguaje Batch que incluía los elementos estándar de la programación estructurada, la cual era convertida a Batch estándar mediante un programa traductor (escrito en Batch) usando un método similar al del preprocesador RatFor que convertía una versión estructurada ("rational") de FORTRAN en un programa FORTRAN-66 estándar.

CLOCK.COM era un programa Termina y Permanece Residente que escribí inspirado en Sidekick de Borland (que también compré), el cual mostraba funciones de reloj/cronómetro/timer en una línea adicional de la pantalla, la número 26, la cual conseguí reprogramando el chip de control de la tarjeta de video CGA o MDA. MKLINK.COM era un programa que permitía copiar un archivo en varios subdirectorios de un disco sin duplicar los datos del archivo. Esta característica era particularmente útil en los discos FAT32 de los reproductores portátiles de música MP3, ya que una misma canción podía aparecer en varios folders (como si fueran playlists) usando sólo una copia física del área de datos del archivo. Conseguí esto modificando directamente los directorios del disco en forma independiente a los servicios de manejo del DOS. Por supuesto, las funciones internas de DOS no aceptaban este manejo: el programa CHKDSK.COM marcaba como errores las ligas adicionales creadas por MKLINK.COM, pero todo funcionaba correctamente mientras el usuario supiera lo que estaba haciendo.

En 1986 impartí el primer curso abierto al público en México, en el Palacio de Minería, sobre "Introducción al lenguaje de ensamblador PC MS-DOS". Algunos de los asistentes habían sido mis profesores en la facultad. Al terminar el curso se pidió su opinión a los asistentes. Uno de mis antiguos profesores se puso en pie y dijo: "He tomado varios cursos antes que estaban por aquí" mientras colocaba su mano a la altura de su cuello. "Pero éste" continuó, "está por acá" mientras subía la mano por arriba de su cabeza. ;) Continué impartiendo dicho curso (y después una segunda parte, mas avanzada) por varios años más.

SYMPLE (SYMbolic Programming LanguagE) era una herramienta educativa basada en Regular Expression Compiler (REC) que diseñé como un paso intermedio entre una calculadora programable de stack (HP) y un lenguaje de programación estructurado, como Pascal. Desarrollé un intérprete SYMPLE completo en Turbo-Pascal con una interface interactiva que incluía un sistema de ayuda muy rápido basado en las múltiples páginas de video proporcionadas por la tarjeta de video. Utilicé este programa para dar algunas clases sobre el lenguaje de programación SYMPLE en el Palacio de Minería; los asistentes recibían gratis una copia del intérprete. En diciembre de 1986 presenté la ponencia "El lenguaje de programación SYMPLE" en la Segunda Conferencia Internacional "Las Computadoras en Instituciones de Educación" patrocinada por la UNAM.

Tomé la biblioteca estándar Borland Graphics Interface (BGI) del lenguaje de programación Turbo-C y la modifiqué de una forma que podía ser utilizada en un programa ejecutable generado por el compilador Clipper de Nantucket. El compilador Clipper también estaba escrito en C, pero fue creado con el compilador C de Microsoft que en ese entonces no contaba con soporte para mostrar gráficas. Añadí un conjunto de gráficas de alto nivel (como barras, pastel, etc) y agrupé todo en el paquete "Grapper.lib: Biblioteca gráfica para el compilador Clipper" que permitía a un programa Clipper mostrar una serie de gráficas estándar de una forma muy sencilla. Vendí algunas copias de este paquete. Un programa de este tipo fue utilizado para mostrar gráficas relacionadas con sismos en el CENAPRED, una oficina de gobierno encargada de mantener datos de terremotos en México (proyecto desarrollado por mi amigo Salvador Medina Morán). En 1991 presenté una ponencia sobre la biblioteca Grapper.lib en la Séptima Conferencia Internacional en la UNAM. Por cierto, las funciones de la biblioteca BGI que trazaban algún tipo de curva (circle, ellipse, arc, etc) presentaban un error bajo ciertas condiciones, así que escribí mis propias funciones de reemplazo utilizando la función BGI DrawPoly. Utilicé una tabla de valores de senos y cosenos multiplicados por un factor entero en una rutina en ensamblador que calculaba los vértices de los polígonos utilizados para trazar las curvas de una forma muy eficiente. Esta rutina trazaba curvas perfectas en la máxima resolución de 640x480 pixels de la tarjeta de video VGA.

Después de eso, modifiqué la estructura de la biblioteca Grapper.lib y la convertí en un programa Termina y Permanece Residente de acuerdo con los estándares establecidos por MS-DOS. Añadí una rutina despachadora para todas las funciones BGI y la encadené a la INT 2FH: el servicio DOS Multiplex. Esto permitía usar la biblioteca BGI como si fuera una API gráfica independiente que podía ser utilizada por cualquier programa DOS ejecutable. Utilicé este esquema para desarrollar una serie de comandos gráficos de alto nivel (el paquete "Batch-Graph") que podían utilizarse directamente en la línea de comandos o a través de archivos Batch. Recuerdo con claridad la primera vez que tecleé "LINE AT 10 10 TO 50 50" en la línea de comandos y una línea apareció en la pantalla sobre el listado de un comando DIR previo. ¡Fantástico! Todos los comandos Batch-Graph también permitían trazar gráficas interactivas controladas con el mouse si el parámetro MOUSE era incluído en lugar de coordenadas. Además, el programa residente también interceptaba las funciones DOS de mostrado de texto en pantalla de manera que el número de líneas destinadas a la entrada de comandos se limitaba a unas pocas líneas en el fondo de la pantalla, lo que permitía preservar las gráficas en la parte superior. Impartí varios cursos sobre el paquete Batch-Graph que utilizaban las gráficas como una introducción atractiva y agradable a la programación Batch; los asistentes recibían el paquete gratis. En 1992 solicité presentar una ponencia sobre el paquete Batch-Graph en la Octava Conferencia Internacional de la UNAM, pero no fue aceptada (tal vez porque ya habían aceptado otra ponencia mía en la misma conferencia).

El comando LINE del paquete Batch-Graph también permitía trazar una línea mediante sus componentes vectoriales (magnitud y ángulo). Estos valores también se guardaban en el código residente de manera que podían ser usados en otro comando LINE posterior, el cual podía aumentar o disminuír el tamaño o ángulo de la línea trazada anteriormente. Esta característica permitía una emulación sencilla del sistema de gráficas "Turtle Graphics" del lenguaje de programación Logo, lo que permitía convertir cualquier programa gráfico Logo en un archivo Batch+Graph de una manera muy simple. Escribí varios archivos Batch para trazar curvas recursivas, como Hilberth, Dragon, etc., que funcionaban perfectamente (la curva "C", que aparece a la derecha, es mi favorita). Sin embargo, la velocidad de proceso de los archivos Batch entonces era muy lenta para trazar curvas mas sofisticadas. Por ejemplo, trazar una curva "C" con un alto nivel recursivo tomaba demasiado tiempo.

Tuve el primer contacto con las curvas recursivas y gráficas fractales en el libro de 1990 Advanced fractal programming in C, que aún tengo. Desarrollé un programa muy eficiente en Turbo-C para trazar el Mandelbrot Set con la parte que efectuaba el cálculo mas complicado escrita en ensamblador. El programa utilizaba una rutina especial de relleno tipo floodfill que evitaba el proceso de las áreas negras de la gráfica, que es la parte que consume mas tiempo. La gráfica se mostraba en la pantalla a la máxima resolución de 640x480 pixels de la tarjeta de video VGA, así que esa gráfica se podía almacenar en un archivo de imagen tipo PCX mediante una utilería screen-dump estándar. Un amigo mío tenía una de las primeras impresoras de matriz de puntos a color que usaba dos cartuchos de cinta (negro y tri-color) la cual podía imprimir una hoja de papel tamaño carta (8 1/2" x 11") con una resolución de 1920x2560, es decir, cuatro veces la resolución de la pantalla VGA. Escribí un programa en Turbo-C que leía cuatro archivos .PCX y enviaba a la impresora los datos necesarios para imprimir las 4 imágenes unidas en una imagen cuatro veces mas ancha, lo cual me permitía imprimir el Mandelbrot-Set a la máxima resolución de la impresora. Para ello, dividía la gráfica completa en 16 secciones, graficaba cada sección en la pantalla y las guardaba en 16 archivos .PCX, para finalmente unir estos 16 archivos e imprimirlos en una hoja de papel que tenía 4 veces mas detalle (resolución) que una impresión directa de la pantalla.

Utilicé este método para crear un póster grande del Mandelbrot-Set compuesto por 4 tiras de papel continuo (Z-fold) con 4 páginas cada una que requería la generación de 256 imágenes individuales en la pantalla. Recuerdo el tiempo que me tomó generar estas más de 256 imágenes (ya que en el centro del Mandelbrot-Set inserté otra imagen con una versión inversa de la misma gráfica para que el póster se viera mas interesante) y combinar todos los archivos .PCX en grupos para imprimir las 4 tiras de papel, para finalmente cortar las tiras de papel y pegarlas con cuidado en una base de madera.

En noviembre de 1992 presenté este póster en la Octava Conferencia Internacional de la UNAM como un ejemplo de los resultados que se podían obtener con mi método para trazar fractales. En la conferencia yo tenía una computadora en la que mostraba secciones del Mandelbrot-Set en cualquier coordenada. Recuerdo que los asistentes que conocían lo que usualmente tardaba una computadora en generar estas gráficas primero pensaron que mi programa sólo mostraba imágenes generadas previamente debido a lo rápido que aparecía una nueva gráfica en la pantalla. La fotografía de la derecha fue tomada en dicha conferencia; mi amigo Salvador Medina Morán aparece detrás de mí.

Cuando Windows 3.1 estuvo disponible en México a mí no me gustó la gran cantidad de recursos que requería ni la lentitud de sus aplicaciones comparadas con las de MS-DOS, aunque tuve que admitir que ciertamente eran mas sencillas de usar por cierta gente. De cualquier forma, no quise instalar Windows en mi computadora. Un día compré el programa Fractal Ecstasy en CD que incorrectamente ¡no especificaba que requería Windows! Entonces instalé Windows 3.1 en mi computadora (usando un juego de casi 30 diskettes de 3 1/2") sólo para usar este CD. De cualquier forma, después de eso comenzé a utilizar Windows, aunque tuve problemas con algunos programas para MS-DOS que accesaban directamente el hardware. Windows 95 fue peor en este sentido porque prohibió utilizar muchos de los "trucos" que yo usaba en mis programas .COM avanzados. Yo necesitaba estudiar la nueva forma de escribir aplicaciones de consola para Windows en ensamblador, pero como estos programas los usaba sólo en mis proyectos personales, decidí retrasar el estudio de dicho tema para después. Continué escribiendo programas .COM para MS-DOS "casi normales" (con sólo unos pocos "trucos") que Windows ejecutaba correctamente.

Cuando conocí al lenguaje de programación Brainfuck me gustó mucho su simplicidad que permitía estudiar las reglas del lenguaje en tan sólo un par de minutos, pero no me gustó la complicación que representaba escribir hasta el programa mas pequeño. Sin embargo, me di cuenta que podía aprovechar la simplicidad de Brainfuck para presentar conceptos de programación de una manera mas sencilla. Desarrollé un compilador de Brainfuck escrito en ensamblador y le añadí subrutinas, tanto predefinidas como definidas por el usuario, así como varias características comunes a los lenguajes de programación modernos, como el concepto de scope, la programación modular, bibliotecas de funciones, etc. Llamé a este proyecto "BrainSub" (Brainfuck con Subrutinas). Este lenguaje es tanto una herramienta educativa que puede ser usada para presentar conceptos avanzados de programación de una forma sencilla, así como un compilador optimizador que genera código nativo x86/DOS muy eficiente en archivos ejecutables .COM. También escribí una serie de bibliotecas BrainSub que permitían el manejo de recursos de la computadora, como el teclado, la pantalla, timers, sonido, etc, y una muy extensa documentación sobre el uso de BrainSub. Esta documentación es, por sí misma, un curso completo de introducción a las computadoras y programación. Escribí un largo artículo sobre BrainSub y lo publiqué en Wikipedia en julio de 2007, pero fue rápidamente removido porque era un "desarrollo original". Alguien movió mi artículo al sitio sobre lenguajes esotéricos en donde yo lo revisaba diariamente a la espera de opiniones o comentarios. Después de un año de esta diaria revisión y sólo conseguir un par de breves comentarios, no pude seguir soportando esa situación y borré el artículo. El lenguaje de programación BrainSub no ha sido utilizado por nadie además de mí.

Entonces la vida me obligó a encarar una serie de asuntos familiares que requerían toda mi atención, así que tuve que suspender el desarrollo de mis proyectos personales (y de todo proyecto relacionado con computadoras) por un cierto período de tiempo...
Top

Mis proyectos para Windows

Varios años después mi situación cambió y pude retomar el desarrollo de mis proyectos personales, aunque con menos tiempo disponible esta vez. Revisé el estado de las computadoras personales y encontré muchos cambios en las facilidades Batch, varios lenguajes de programación nuevos y la versión actual de Windows de 64-bits que ya no soportaba la ejecución de los viejos archivos .COM para MS-DOS, así que al fin tuve que aprender la forma de escribir aplicaciones de consola para Windows en ensamblador. Después de eso, actualicé varios de mis viejos programas auxiliares para MS-DOS, desarrollé algunas aplicaciones nuevas escritas en ensamblador de 32-bits y en el nuevo lenguaje de programación JScript (similar a C), y comencé a escribir un manual de usuario y guía de referencia de todas estas facilidades Batch. Llamé a este proyecto "Modern Batch File Programming" y le dediqué gran parte de mi tiempo hasta hace pocos años.

Desde hace tiempo yo quería crear una página Web para publicar mis proyectos. Probé algunos de los sitios de "auto-creación guiada por menús" pero no me gustó el método usado en la definición de la página ni los resultados obtenidos. Me puse a estudiar HTML para crear una página desde cero por mí mismo. Comencé a escribir una "guía de consulta rápida" que me ayudara en la definición de partes específicas de las páginas Web, pero terminé desarrollando un archivo Batch que creaba esas partes en forma automática a partir de elementos tipo BBCode (como los utilizados en Wikipedia) colocados en un archivo de texto. Esta aplicación podía generar un archivo HTML completo y funcional en forma muy sencilla. El resultado me gustó mucho, así que le añadí varias características al programa traductor, incluída la animación de imágenes via JavaScript, y otras facilidades avanzadas. Debo decir que todo esto lo hice por flojera: no me gustaba tener que consultar el extenso manual de HTML cada vez que quería utilizar alguna característica avanzada, complicada y difícil de recordar. En lugar de eso, consultaba el manual una sola vez para insertar el método correspondiente en el programa traductor y después utilizaba esa característica de una forma mas sencilla y agradable. Llamé a este proyecto TextToHTML.bat. Todas las páginas Web que conforman este sitio fueron creadas utilizando dicho programa.

Siempre he tratado de difundir la enseñanza y uso del lenguaje de programación ensamblador. En el primer curso sobre ensamblador que impartí en la DECFI-UNAM utilicé métodos educativos novedosos para facilitar la enseñanza de un lenguaje inherentemente complejo. Un agradable recuerdo que conservo es la felicitación que me extendió uno de los asistentes, que fue mi profesor en la facultad, cuando el curso terminó. (Cuando escribo esto recuerdo que en las clausuras de mis cursos en el Palacio de Minería los asistentes casi siempre me apludían; en algunas ocasiones los aplausos duraron un par de minutos). Como apoyo a la difusión del lenguaje ensamblador, escribí un ensamblador Intel 80286 muy básico escrito en Batch, de manera que hubiera una justificación para que los numerosos usuarios de archivos Batch pudieran tener un contacto simple con este lenguaje.

Continué con el desarrollo de métodos y técnicas originales destinadas a la moderna programación Batch. Escribí varios programas en ensamblador y en JScript que proporcionaban características nuevas o mas rápidas, pero también descubrí formas diferentes de utilizar comandos ya existentes que dotaban de nuevas capacidades a los archivos Batch. Estos nuevos métodos variaban desde trucos muy simples, como Ingresar una contraseña no visible via un bug de FINDSTR, o Mover el cursor a cualquier posición usando el comando ECHO, o una interesante forma de expansión de una %variable% que efectúa la misma labor que un comando FOR sencillo; pasando por un método para procesar varios archivos en paralelo en forma eficiente aprovechando los múltiples procesadores de la computadora, o por juegos animados en color, como Tetris o VIBORAS.bat (juego tipo snake para varios jugadores); hasta llegar a técnicas completas de soporte que permiten el desarrollo de aplicaciones Batch muy diferentes a las convencionales. A continuación se describen tres de las más interesantes.

1- Trazar gráficas en la pantalla en "modo de texto" con resolución de pixels, es decir, verdaderas gráficas estándar. Esto se logra definiendo un tipo de letra Raster (bitmap) de tamaño 1x1 pixels que se selecciona en la ventana de cmd.exe, y aumentando el número de líneas y columnas en la pantalla al tamaño deseado de la gráfica (lo que se hace con el comando estándar MODE CON). Por ejemplo, el Mandelbrot-Set mostrado a la derecha fue trazado por un archivo Batch usando el font de tamaño 1x1 en una ventana de texto con 912 columnas y 684 líneas. Los "pixels" (caracteres, realmente) se muestran con mi programa auxiliar ColorShow.exe (la moderna versión Windows de mi antiguo programa que mostraba texto en color). Al terminar la gráfica se ejecuta un comando PAUSE, por lo que la última línea muestra el mensaje estándar "Presione una tecla para continuar . . ." ¡con letras que miden un pixel! (Dé click en la imagen para aumentarla).

2- Usando el tipo de letra de tamaño 1x1 pixels es posible mostrar texto estándar mediante el mismo método que utilizan las rutinas internas del Sistema Operativo, es decir, leyendo un archivo de definición de tipo de letra que especifique los pixels individuales que se deben encender para mostrar cada caracter. Del lado izquierdo aparece la pantalla de un programa que usa este método para mostrar texto en diferentes tamaños y colores, y del lado derecho está la pantalla que muestra texto de varios archivos de definición de tipos de letra diferentes.

3- Un método para combinar código Batch, código JScript y código HTA (HTML) en un mismo script tri-híbrido que permite crear ventanas individuales que muestren gráficas mediante la etiqueta "canvas" de la especificación HTML5, todo bajo control del archivo Batch. Dos ejemplos de uso de esta técnica son la biblioteca gráfica Batch-BGI para archivos Batch, y la aplicación "Turtle Graphics" en archivos Batch. Un ejemplo del resultado que puede obtenerse de la segunda aplicación se muestra del lado izquierdo. Note que cada una de las ventanas gráficas en este ejemplo se generan mediante dos líneas de código Batch: una para crear la ventana (como call :newWindow "Five Rose") y otra línea, usualmente larga, para mostrar la gráfica.

Uno de los proyectos que he perseguido toda mi vida es crear un lenguaje de programación lo suficientemente simple para ser comprendido por personas sin experiencia en programación, pero que al mismo tiempo sea lo suficientemente útil para crear aplicaciones reales con él. Pienso que finalmente he diseñado un lenguaje con estas características. RPN@PRGM es un lenguaje de programación basado en (antiguas) calculadoras HP, por lo que es lo bastante sencillo para ser entendido por la mayoría de las personas que tengan sólo un conocimiento básico de matemáticas, como pueden ser jóvenes de prepa o incluso secundaria. Por otro lado, el compilador RPN@PRGM genera código ejecutable muy eficiente que es adecuado para escribir un amplio rango de aplicaciones de tamaño pequeño y mediano. Un beneficio adicional es que el lenguaje también sirve como una introducción muy sencilla al lenguaje de programación ensamblador Intel x86 (MASM32). Este es el proyecto en el que estoy inmerso actualmente. Se invita al lector a que lo revise.
Top

Los proyectos de software

Esta es la lista de los proyectos que he subido a este sitio. Por favor, note que éste es un trabajo en progreso. Añadiré nuevos proyectos, o secciones o programas individuales, a medida que los vaya completando. Usted puede Seguirme en Twitter para recibir noticias sobre futuros cambios y adiciones a este sitio. Lo invito a utilizar cualquier información o programa que se encuentre en este sitio para su beneficio. El hacerlo será la culminación de los más de 35 años que he pasado desarrollando todos estos proyectos personales. Sin embargo, antes de hacerlo es conveniente leer este aviso legal.


Antonio Pérez Ayala